package com.qf.filter;

import com.qf.entity.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *  授权控制
 */
@WebFilter("/*")
public class F005_AuthFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //放行一些资源(静态资源、登录相关、注册相关)
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //获取当前正在访问的资源
        /*
            一个资源访问: http://localhost:80/xxx/yy?key=value&key2=value2
            http://localhost:80/xxx/yy  -- URL
            /xxx/yy  -- URI
            ?key=value&key2=value2   -- queryString
         */
        String uri = req.getRequestURI();
        if (uri !=null && uri.endsWith("login.jsp")
            ||(uri!=null && uri.endsWith("auth.jsp"))
            ||(uri!=null && uri.endsWith("index.jsp"))
        ){
            //放行
            chain.doFilter(req,resp);
            return;
        }

        //判断用户是否登录，如果登录了， 才继续判断权限。如果没有登录，去登录
        User user = (User) req.getSession().getAttribute("user");
        if(user != null){
            //登陆了 -- 开始鉴权 (我有什么权限，我访问的资源需要什么权限)
            /*
             *  如果我有的权限，和资源需要的权限相同，放行访问资源
             *  如果我有的权限，和资源需要的权限不相同，拦截，告诉没有访问权限
             *  假设：我访问的/test资源，需要T1权限
             *      其他资源不需要任何权限
             */
            if (uri != null && uri.endsWith("test")){
                //判断是否有权限
                if (user.getRole().equals("T1")){
                    //有权限 -- 放行
                    chain.doFilter(req,resp);
                }else{
                    //没有权限 -- 跳转到授权页面
                    resp.sendRedirect("auth.jsp");
                }
            }else if (uri!= null && uri.endsWith("login")){
                //去首页
                resp.sendRedirect("index.jsp");
            }else{
                //不需要权限 -- 放行
                chain.doFilter(req,resp);
            }
        }else{
            //没有登陆--重定向到登录页面
            resp.sendRedirect("login.jsp");
        }

    }

    @Override
    public void destroy() {

    }
}
